package usuarios;

import java.util.List;

import alugaveis.Alugavel;
import exceptions.CPFInvalidoException;
import exceptions.EmailInvalidoException;
import exceptions.ListaEnderecoInvalidaException;
import exceptions.NomeInvalidoException;
import exceptions.SenhaInvalidaException;
import exceptions.TelefoneInvalidoException;
import exceptions.UsernameInvalidoException;

/**
 * @author Vinicius
 */

public class Administrador extends Funcionario {
	
	private static final long serialVersionUID = 1L;
	
	private List<Funcionario> funcionarios;
	private List<Cliente> clientes;
	private List<Alugavel> produtos;
	
	/**
	 * Construtor de um Administrador.
	 * 
	 * @param nome
	 *            O nome da Pessoa. Nao pode ser null e deve ser uma String com
	 *            no minimo um espaco entre duas cadeias de letras.
	 * @param cpf
	 *            O CPF da Pessoa. Nao pode ser nulo e deve conter 11 digitos ou
	 *            11 digitos separados, inicialmente, 3 a 3 por pontos e os
	 *            ultimos dois digitos antecedidos por um hifen.
	 * @param telefone
	 *            O telefone da Pessoa. O telefone nao pode ser nulo e deve ser
	 *            formado por 8 digitos ou 8 digitos separados 4 a 4 por um
	 *            hifen.
	 * @param email
	 *            O email da Pessoa. O email nao pode ser nulo e deve ter,
	 *            inicialmente, um arroba entre cadeias de caracteres seguidos
	 *            de um ponto e um final de dois ou tres caracteres.
	 * @param enderecos
	 *            A lista de enderecos da Pessoa, o primeiro endereco deve ser o
	 *            principal. Apenas o endereco principal eh obrigatorio para toda
	 *            pessoa.
	 * @param username
	 *            O username da Pessoa. Um username valido possui no minimo 6
	 *            caracteres.
	 * @param senha
	 *            A senha da Pessoa. Uma senha valida possui no minimo 6
	 *            caracteres e nao pode ser igual ao username.
	 * @throws NomeInvalidoException
	 *             Se o nome for null ou nao for uma String com no minimo um
	 *             espaco entre duas cadeias de letras.
	 * @throws CPFInvalidoException
	 *             Se o CPF for nulo ou nao conter 11 digitos ou 11 digitos
	 *             separados, inicialmente, 3 a 3 por pontos e os dois ultimos
	 *             digitos antecedidos por um hifen.
	 * @throws TelefoneInvalidoException
	 *             Se o telefone for nulo ou nao conter 8 digitos ou 8 digitos 4
	 *             a 4 separados por um hifen.
	 * @throws EmailInvalidoException
	 *             Se o email for nulo ou nao ter, inicialmente, um arroba entre
	 *             cadeias de caracteres seguidos de um ponto e um final de dois
	 *             ou tres caracteres.
	 * @throws ListaEnderecoInvalidaException
	 *             Se a lista de enderecos for nula ou nao conter um endereco
	 *             principal na primeira posicao.
	 * @throws UsernameInvalidoException
	 *             Se o username for nulo ou nao conter o minimo de 6
	 *             caracteres.
	 * @throws SenhaInvalidaException
	 *             Se a senha for nula ou igual ao username ou nao conter o
	 *             minimo de 6 caracteres.
	 */
	
	public Administrador(String nome, String cpf, String telefone,
			String email, List<Endereco> enderecos, String username,
			String senha) throws NomeInvalidoException, CPFInvalidoException,
			TelefoneInvalidoException, EmailInvalidoException,
			SenhaInvalidaException, UsernameInvalidoException,
			ListaEnderecoInvalidaException {
		super(nome, cpf, telefone, email, enderecos, username, senha);
	}
	
	/**
	 * Metodo que cadastra um novo funcionario.
	 */
	
	public void cadastraFuncionario(){
		if(!(funcionarios.contains(this))){
			funcionarios.add(this);
		}
	}

	/**
	 * Metodo que cadastra um novo produto na loja.
	 */
	
	public void cadastraProduto(Alugavel produto){
		if(!(produtos.contains(produto))){
			produtos.add(produto);
		}
	}
	
	/**
	 * Elimina o cadastro de algum cliente caso seja necessario.
	 */
	
	public void apagaCadastroCliente(){
			if(clientes.contains(this)){
				clientes.remove(this);
			}
	}
	
	/**
	 * Apaga o cadastro do antigo funcionario em casos de demissao.
	 */
	
	public void apagaCadastroFuncionario(){
		if(funcionarios.contains(this)){
			funcionarios.remove(this);
		}
	}
	
	/**
	 * Permite ao Administrador da loja ver o desempenho de 
	 * cada funcionario ao longo do mes.
	 */
	
	public void verEstatisticas(){
		for(int i = 0; i < funcionarios.size(); i++){
			System.out.println("Funcionario: " + funcionarios.get(i).getNome());
			System.out.println("CPF: " + funcionarios.get(i).getCpf());
			System.out.println("Saldo do Caixa: " + funcionarios.get(i).getCaixa());
			System.out.println("--------");
		}	
	}
}